import { markRaw } from "vue";

/**
 * GLTF模型加载选项接口
 */
export interface GLTFModelOptions {
  url: string; // 模型文件路径
  map: any; // 地图实例
  id: string; // 模型ID
  position: any; // 模型位置（TMap.LatLng对象）
  scale?: number[]; // 模型缩放比例
  mask?: any; // 模型可见范围
  onLoaded?: () => void; // 模型加载成功回调
  onLoadFailed?: () => void; // 模型加载失败回调
}

/**
 * 加载GLTF模型到地图
 * @param TMap TMap API实例
 * @param options 模型加载选项
 * @returns 模型实例
 */
export const loadGLTFModel = (TMap: any, options: GLTFModelOptions): any => {
  const {
    url, // 模型地址
    map, // 模型渲染地图
    id, // 模型具体id
    position, // 模型位置（TMap.LatLng对象）
    scale = [1, 1, 1], // 模型缩放比例（默认[1, 1, 1]）
    mask, // 模型可见范围
    onLoaded, // 模型加载成功回调
    onLoadFailed, // 模型加载失败回调
  } = options;

  // 创建模型实例
  const modelInstance = markRaw(
    new TMap.model.GLTFModel({
      url,
      map,
      id,
      position,
      scale,
      mask,
    })
  );

  // 模型资源加载完成回调
  modelInstance.on("loaded", () => {
    // 调用用户提供的加载成功回调
    if (onLoaded) {
      onLoaded();
    }
  });

  // 模型加载失败回调
  modelInstance.on("load_failed", () => {
    // 调用用户提供的加载失败回调
    if (onLoadFailed) {
      onLoadFailed();
    }
  });

  return modelInstance;
};

/**
 * 销毁模型实例
 * @param modelInstance 模型实例
 */
export const destroyGLTFModel = (modelInstance: any): void => {
  if (modelInstance) {
    modelInstance.remove();
    modelInstance.destroy(); // 调用模型实例的销毁方法
  }
};
